home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
magazine
/
drdobbs
/
1992
/
02
/
dflt10
/
console.c
< prev
next >
Wrap
Text File
|
1991-09-25
|
6KB
|
291 lines
/* ----------- console.c ---------- */
#include "dflat.h"
/* ----- table of alt keys for finding shortcut keys ----- */
static int altconvert[] = {
ALT_A,ALT_B,ALT_C,ALT_D,ALT_E,ALT_F,ALT_G,ALT_H,
ALT_I,ALT_J,ALT_K,ALT_L,ALT_M,ALT_N,ALT_O,ALT_P,
ALT_Q,ALT_R,ALT_S,ALT_T,ALT_U,ALT_V,ALT_W,ALT_X,
ALT_Y,ALT_Z,ALT_0,ALT_1,ALT_2,ALT_3,ALT_4,ALT_5,
ALT_6,ALT_7,ALT_8,ALT_9
};
unsigned video_mode;
unsigned video_page;
static int near cursorpos[MAXSAVES];
static int near cursorshape[MAXSAVES];
static int cs;
static union REGS regs;
void initvideo(void)
{
if (isEGA() || isVGA()) {
regs.x.ax = 0x1003;
regs.h.bl = 0;
int86(VIDEO, ®s, ®s);
}
}
void restorevideo(void)
{
if (isEGA() || isVGA()) {
regs.x.ax = 0x1003;
regs.h.bl = 1;
int86(VIDEO, ®s, ®s);
}
}
void SwapCursorStack(void)
{
if (cs > 1) {
swap(cursorpos[cs-2], cursorpos[cs-1]);
swap(cursorshape[cs-2], cursorshape[cs-1]);
}
}
#ifndef MSC
#ifndef WATCOM
#define ZEROFLAG 0x40
/* ---- Test for keystroke ---- */
int keyhit(void)
{
_AH = 1;
geninterrupt(KEYBRD);
return (_FLAGS & ZEROFLAG) == 0;
}
#endif
#endif
/* ---- Read a keystroke ---- */
int getkey(void)
{
int c;
while (keyhit() == 0)
;
if (((c = bioskey(0)) & 0xff) == 0)
c = (c >> 8) | 0x1080;
else
c &= 0xff;
return c & 0x10ff;
}
/* ---------- read the keyboard shift status --------- */
int getshift(void)
{
regs.h.ah = 2;
int86(KEYBRD, ®s, ®s);
return regs.h.al;
}
static int far *clk = MK_FP(0x40,0x6c);
/* ------- macro to wait one clock tick -------- */
#define wait() \
{ \
int now = *clk; \
while (now == *clk) \
; \
}
/* -------- sound a buzz tone ---------- */
void beep(void)
{
wait();
outp(0x43, 0xb6); /* program the frequency */
outp(0x42, (int) (COUNT % 256));
outp(0x42, (int) (COUNT / 256));
outp(0x61, inp(0x61) | 3); /* start the sound */
wait();
outp(0x61, inp(0x61) & ~3); /* stop the sound */
}
/* -------- get the video mode and page from BIOS -------- */
void videomode(void)
{
regs.h.ah = 15;
int86(VIDEO, ®s, ®s);
video_mode = regs.h.al;
video_page = regs.x.bx;
video_page &= 0xff00;
video_mode &= 0x7f;
}
/* ------ position the cursor ------ */
void cursor(int x, int y)
{
videomode();
regs.x.dx = ((y << 8) & 0xff00) + x;
regs.h.ah = SETCURSOR;
regs.x.bx = video_page;
int86(VIDEO, ®s, ®s);
}
/* ------ get cursor shape and position ------ */
static void near getcursor(void)
{
videomode();
regs.h.ah = READCURSOR;
regs.x.bx = video_page;
int86(VIDEO, ®s, ®s);
}
/* ------- get the current cursor position ------- */
void curr_cursor(int *x, int *y)
{
getcursor();
*x = regs.h.dl;
*y = regs.h.dh;
}
/* ------ save the current cursor configuration ------ */
void savecursor(void)
{
if (cs < MAXSAVES) {
getcursor();
cursorshape[cs] = regs.x.cx;
cursorpos[cs] = regs.x.dx;
cs++;
}
}
/* ---- restore the saved cursor configuration ---- */
void restorecursor(void)
{
if (cs) {
--cs;
videomode();
regs.x.dx = cursorpos[cs];
regs.h.ah = SETCURSOR;
regs.x.bx = video_page;
int86(VIDEO, ®s, ®s);
set_cursor_type(cursorshape[cs]);
}
}
/* ------ make a normal cursor ------ */
void normalcursor(void)
{
set_cursor_type(0x0607);
}
/* ------ hide the cursor ------ */
void hidecursor(void)
{
getcursor();
regs.h.ch |= HIDECURSOR;
regs.h.ah = SETCURSORTYPE;
int86(VIDEO, ®s, ®s);
}
/* ------ unhide the cursor ------ */
void unhidecursor(void)
{
getcursor();
regs.h.ch &= ~HIDECURSOR;
regs.h.ah = SETCURSORTYPE;
int86(VIDEO, ®s, ®s);
}
/* ---- use BIOS to set the cursor type ---- */
void set_cursor_type(unsigned t)
{
videomode();
regs.h.ah = SETCURSORTYPE;
regs.x.bx = video_page;
regs.x.cx = t;
int86(VIDEO, ®s, ®s);
}
/* ---- test for EGA -------- */
int isEGA(void)
{
if (isVGA())
return 0;
regs.h.ah = 0x12;
regs.h.bl = 0x10;
int86(VIDEO, ®s, ®s);
return regs.h.bl != 0x10;
}
/* ---- test for VGA -------- */
int isVGA(void)
{
regs.x.ax = 0x1a00;
int86(VIDEO, ®s, ®s);
return regs.h.al == 0x1a && regs.h.bl > 6;
}
static void Scan350(void)
{
regs.x.ax = 0x1201;
regs.h.bl = 0x30;
int86(VIDEO, ®s, ®s);
}
static void Scan400(void)
{
regs.x.ax = 0x1202;
regs.h.bl = 0x30;
int86(VIDEO, ®s, ®s);
}
/* ---------- set 25 line mode ------- */
void Set25(void)
{
if (isVGA()) {
Scan400();
regs.x.ax = 0x1114;
}
else
regs.x.ax = 0x1111;
regs.x.bx = 0;
int86(VIDEO, ®s, ®s);
}
/* ---------- set 43 line mode ------- */
void Set43(void)
{
if (isVGA())
Scan350();
regs.x.ax = 0x1112;
regs.x.bx = 0;
int86(VIDEO, ®s, ®s);
}
/* ---------- set 50 line mode ------- */
void Set50(void)
{
if (isVGA())
Scan400();
regs.x.ax = 0x1112;
regs.x.bx = 0;
int86(VIDEO, ®s, ®s);
}
/* ------ convert an Alt+ key to its letter equivalent ----- */
int AltConvert(int c)
{
int i, a = 0;
for (i = 0; i < 36; i++)
if (c == altconvert[i])
break;
if (i < 26)
a = 'a' + i;
else if (i < 36)
a = '0' + i - 26;
return a;
}
#if MSC | WATCOM
int getdisk(void)
{
unsigned int cd;
_dos_getdrive(&cd);
cd -= 1;
return cd;
}
#endif